package r25.board;

import java.util.List;

import r25.engine.Composition;
import r25.engine.IGameInstance;
import r25.engine.IGameService;
import r25.room.IRoom;
import r25.tools.IParametrable;

public interface IBoard extends IParametrable {
	public enum CONTROL_DIRECTION {
		POSITIVE, NEGATIVE
	}

	public enum CONTROL_TYPE {
		COLUMN, ROW
	}

	public abstract void start(IGameInstance gi) throws Exception;

	public abstract void addRoom(IRoom r) throws Exception;

	public abstract void switchRoomsAt(int pos1x, int pos1y, int pos2x,
			int pos2y) throws Exception;

	public abstract void controlRooms(int pos, CONTROL_DIRECTION cd,
			CONTROL_TYPE ct) throws Exception;

	public abstract void controlRooms(ControlMove controlMove) throws Exception;

	public abstract List<ControlMove> getValidControlMoves();

	public abstract List<ControlMove> getValidControlMoves(RoomPosition pos);

	public abstract void setup(IGameService gameService, Composition comp)
			throws Exception;

	public abstract List<IRoom> getRooms();

	public abstract List<IRoom> getRoomsByName(String name);

	public abstract IRoom getRoomByName(String name) throws Exception;

	public abstract IRoom getRoomAt(int posX, int posY);

	public abstract IRoom getRoomAt(RoomPosition posXY);

	public abstract List<RoomPosition> getAdjacentRoomPositions(IRoom room,
			boolean checkAccessible);

	public abstract void setRoomAt(IRoom r, int posX, int posY);

	public abstract int getLowerLimitX();

	public abstract int getUpperLimitX();

	public abstract int getLowerLimitY();

	public abstract int getUpperLimitY();

	public abstract int getSizeX();

	public abstract int getSizeY();

	public abstract void onNextTurn();

	public abstract String toString(boolean showHidden);

	public abstract List<RoomPosition> getHiddenRoomPositions();

}
